AWS CloudFormation テンプレートを作ってもらおう!
こんにちは!Koty-Mousa 矢坂幸太郎 です!
今回は、生成AI を使って CloudFormation テンプレートを作ってみました!
なお、CloudFormation については 下記記事をご覧ください
CloudFormation テンプレートを作ってもらおう!
今回は、前回の記事で紹介した「踏み台サーバ」構成の検証用環境を作成するテンプレートを作成します。
あらかじめ...
あらかじめ、キーペアの作成を行う必要があります。
今回は、DevIO-CF-Key-A と DevIO-CF-Key-B を設定しました。
キーペアは、作成時のみダウンロードできるため、今回の検証用としては CloudFormation でキーペアを作成するよりも安全かつ簡単にキーを受け取ることができるため、この方法を採用しました。
Claude に聞いてみよう!
今回は、Claude 3.5 Sonnet v2 (via AI-Starter)を用います
最初は より短い文章でしたが、AWSコンソールで複数のエラーが返されてしまったたため、エラーを出さないような注意文を付け足しています。
また、OSやインスタンスタイプは、指定しないと 誤ったOSなどを使用することがあります。
必要な情報はユーザが提供することが大切です。
「AI-Starter」では、画像の入力が可能なため(※1)前回作成した構成図を添付して、下記質問を行います。
この画像のような形のCloudFormationテンプレート・完全版を作成してください。
キーペアは、DevIO-CF-Key-A・DevIO-CF-Key-B を使用します。
- OS: Amazon Linux 2023 ami-0ab02459752898a60
- インスタンスタイプ: t3.micro
- リージョン: ap-northeast-1
- セキュリティグループ: 必要なものだけ(全開放は禁止です)
- CIDRブロック: 適切なものを選択してください
インスタンス名は
- A(パブリック)DevIO-Bastion
- B(プライベート)DevIO-Private
可能な限り最新版を用いてください
Invalid template resource property 'Default' エラーに注意してください
EC2インスタンスのプロパティに直接AssociatePublicIpAddressを指定するのではなく、NetworkInterfacesを使用してくださいパラメータで、My IP を「x.x.x.x」形式で指定させます。「/32」はユーザに入力させないでください
※ami含め、上記は東京(ap-northeast-1)リージョン・2024年12月現在の情報です。
お客様の要件に合わせて、最新の情報で実施してください。
(※1)アシスタントの種類によっては、画像の添付ができない場合があります
そして、下記結果が返ってきました
こちらをクリックして表示
AWSTemplateFormatVersion: '2010-09-09'
Description: 'VPC with Public and Private EC2 instances'
Parameters:
MyIpAddress:
Description: Your IP address (x.x.x.x format)
Type: String
AllowedPattern: '^([0-9]{1,3}\.){3}[0-9]{1,3}$'
ConstraintDescription: Must be a valid IP address in x.x.x.x format
Resources:
# VPC
VPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
EnableDnsHostnames: true
EnableDnsSupport: true
Tags:
- Key: Name
Value: DevIO-VPC
# Internet Gateway
InternetGateway:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: Name
Value: DevIO-IGW
AttachGateway:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
VpcId: !Ref VPC
InternetGatewayId: !Ref InternetGateway
# Subnets
PublicSubnet:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: 10.0.0.0/24
AvailabilityZone: !Select [0, !GetAZs '']
MapPublicIpOnLaunch: true
Tags:
- Key: Name
Value: DevIO-Public-Subnet
PrivateSubnet:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: 10.0.1.0/24
AvailabilityZone: !Select [0, !GetAZs '']
Tags:
- Key: Name
Value: DevIO-Private-Subnet
# Route Tables
PublicRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref VPC
Tags:
- Key: Name
Value: DevIO-Public-RT
PublicRoute:
Type: AWS::EC2::Route
DependsOn: AttachGateway
Properties:
RouteTableId: !Ref PublicRouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref InternetGateway
PublicSubnetRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PublicSubnet
RouteTableId: !Ref PublicRouteTable
# Security Groups
BastionSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Security group for Bastion host
VpcId: !Ref VPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: !Sub ${MyIpAddress}/32
Tags:
- Key: Name
Value: DevIO-SG-Bastion
PrivateSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Security group for Private instance
VpcId: !Ref VPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
ToPort: 22
SourceSecurityGroupId: !Ref BastionSecurityGroup
Tags:
- Key: Name
Value: DevIO-SG-Private
# EC2 Instances
BastionInstance:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-0ab02459752898a60
InstanceType: t3.micro
KeyName: DevIO-CF-Key-A
Tags:
- Key: Name
Value: DevIO-Bastion
NetworkInterfaces:
- DeviceIndex: 0
SubnetId: !Ref PublicSubnet
GroupSet:
- !Ref BastionSecurityGroup
AssociatePublicIpAddress: true
PrivateInstance:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-0ab02459752898a60
InstanceType: t3.micro
KeyName: DevIO-CF-Key-B
Tags:
- Key: Name
Value: DevIO-Private
NetworkInterfaces:
- DeviceIndex: 0
SubnetId: !Ref PrivateSubnet
GroupSet:
- !Ref PrivateSecurityGroup
AssociatePublicIpAddress: false
Outputs:
BastionPublicIP:
Description: Public IP of Bastion Host
Value: !GetAtt BastionInstance.PublicIp
PrivateInstancePrivateIP:
Description: Private IP of Private Instance
Value: !GetAtt PrivateInstance.PrivateIp
AI-Starter には、コードをダウンロードする機能があります。
クリックしてダウンロードします。
AWSコンソール CloudFront → スタック → スタックの作成 に移動し、先程ダウンロードしたファイルを アップロードします
次の画面で スタック名 と 手元PCの IPアドレスを入力します。
スタック名はわかりやすい名前を設定してください。
手元PCの IPアドレスは、https://checkip.amazonaws.com/
などで調べることができます。
以降の画面では、今回は特に設定を変更せず スタックを作成します。
すぐに、 EC2インスタンス や VPC など、先程のテンプレートで設定したリソースが自動で作成されます。
スタックの作成が完了しました!
EC2画面 を確認すると、設定したインスタンスが作成されていることが確認できます。
「Private」には パブリックIP が無く、「Bastion」は パブリックIP が付与されています。
実際に、踏み台サーバ経由のアクセスに成功しました!
なお、作成されたリソースは、CloudFormation スタックを削除することで、全て削除されます。
「DELETE_COMPLETE」表示を確認してください。
今回は、生成AIで CloudFormation テンプレートを作りました!
AWS利用に大変有効で便利だと感じました。今後も様々なやり方を探求していきます。
PR:AI-Starterって何?
本ブログで利用している Claude は、Anthropic のサイトから Claude を利用しているわけではありません。
クラスメソッドが法人向けに提供する生成AI環境構築サービス、AI-Starterを利用しております!
こちらは、クラスメソッドグループの社員も利用しております。
Claude だけではなく、ChatGPT、Geminiといった、複数の生成AIサービスを1つのプラットフォームでシームレスに、そして安全に利用できるサービスです。
「そもそもどんな業務に生成AIを活用できるかが分からない」という会社様も、ぜひ下記ページをご覧ください!
AIに頼りきらない
生成AI 使用時の非常に重要な点として、「AIの出力をそのまま鵜呑みにしない」ことがあります。弊社ガイドラインには『文章生成AIが生成する文章は、内容が正しくない場合があることを認識して利用すること』と記載があります。
現在、Claude をはじめ多くの生成AIは非常に良い結果を返していますが、時に正しくない結果を返すことがあります。
私が時々遭遇するのは、「プロンプト文・指示が不明瞭なため、AIが指示を誤った解釈をしてしまった」ことです。
また、「ハルシネーション」と呼ばれる、誤った情報をまるで本当かのように返答するケースを見かけることがあります。
今回の「エラーを返す(間違いが含まれる)CloudFrontテンプレート」も、ハルシネーションの一種です。
AIの出力は、問題がないことをご自身で確認の上、利用するようにしましょう。
弊社内ガイドラインは、下記ブログをご覧ください
ご覧いただきありがとうございました。
以上、Koty-Mousa 矢坂幸太郎 がお伝えしました!
The avatar, logo and name of "Koty-Mousa 矢坂幸太郎" and "Clamerus, dev. by Koty-Mousa" (include inconsistent/abbreviation spelling) are owned and copyrighted by Koty-Mousa (individually).
アノテーション株式会社について
アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。当社は様々な職種でメンバーを募集しています。「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。